// 1、基准地址
// 2、超时时间
// 3、请求之前展示loading
// 4、请求完成关闭loading

import store from "@/store";

const baseURL = "https://pcapi-xiaotuxian-front-devtest.itheima.net";

const request = {
  /**
   * 配置请求拦截
   * @param {UniApp.RequestOptions} config
   */
  invoke(config) {
    // console.log("2323");
    // 请求的配置对象
    // 判断请求的url是否有域名
    // 如果没有域名，手动拼接一个baseURL
    // 'source-client': 'miniapp'
    uni.showLoading({
      title: "加载中",
      mask: true,
    });
    if (!config.url.startsWith("http")) {
      config.url = baseURL + config.url;
    }
    // 设置超时时间
    config.timeout = 10000;
    // 添加请求头部
    config.header = {
      ...config.header,
      "source-client": "miniapp",
      // TODO: 添加token的统一注入
    };
    //   进行token的统一注入 >> token存储在vuex里面
    const token = store.state.user.profile.token;
    // 先判断一下是否存在，如果存在话注入token
    if (token) {
      config.header.Authorization = token;
    }
  },
  complete() {
    // 关闭loading效果
    uni.hideLoading();
  },
};

// 配置拦截器
uni.addInterceptor("request", request);

// 上传文件添加了拦截
uni.addInterceptor("uploadFile", request);

// 1、返回的是一个promise
// 2、如果状态码200-300之间，走成功，其余的走失败
// 3、如果请求成功了，直接把res.data返回
// 4、如果请求失败进行错误提示
const http = (config) => {
  return new Promise((resolve, reject) => {
    uni.request({
      ...config,
      /**
       * 成功处理回调函数
       * @param {UniApp.RequestSuccessCallbackResult} res
       */
      success(res) {
        // console.log(res);
        // 如果后端返回的状态码为200-300之间
        if (res.statusCode >= 200 && res.statusCode < 300) {
          resolve(res.data); // 把后端返回的数据直接返回去
        } else {
          uni.showToast({
            title: res.data.message || "系统出错，请重试",
            icon: "none",
            duration: 1500,
            mask: true,
          });
          reject(res);
        }
      },
      fail(err) {
        uni.showToast({
          title: "请检查网络后重试",
          icon: "none",
          duration: 1500,
          mask: true,
        });
        reject(err);
      },
    });
  });
};
const methodList = ["GET", "POST", "DELETE", "PUT", "PATCH"];

methodList.forEach((method) => {
  http[method.toLowerCase()] = function (url, data) {
    return http({
      method,
      url,
      data,
    });
  };
});
export default http;
